#include "StdMysql.h"

StdMysql::StdMysql()
{
    isConnected = false;
    mysql_init(&mysql);
}

StdMysql::~StdMysql()
{
    if (isConnected)
    {
        mysql_close(&mysql);
    }
}

bool StdMysql::Connect(CStrRef host, CStrRef user, CStrRef passwd, CStrRef dbName, int port)
{
    if (!mysql_real_connect(&mysql, host.c_str(), user.c_str(), passwd.c_str(), dbName.c_str(), port, nullptr, 0))
    {
        std::cout << "connect error :" << mysql_error(&mysql) << std::endl;
        return false;
    }
    return true;
}

bool StdMysql::Exec(CStrRef sql)
{
    if (mysql_real_query(&mysql, sql.c_str(), sql.size()))
    {
        std::cout << "语句执行失败!\n";
        std::cout << mysql_error(&mysql) << std::endl;
        return false;
    }
    isConnected = true;
    return true;
}

StrMatrix StdMysql::GetSqlResult(CStrRef sql)
{
    if (!Exec(sql))
    {
        return {};
    }
    MYSQL_RES *result = mysql_store_result(&mysql);
    StrMatrix res;
    if (result)
    {
        int fieldCount = mysql_field_count(&mysql); // 获取列数
        char **sql_row;
        while ((sql_row = mysql_fetch_row(result)) != nullptr) // 按行拿取数据
        {
            std::vector<std::string> vec;
            for (int i = 0; i < fieldCount; i++)
            {
                std::cout << sql_row[i] << " ";
            }
            std::cout << std::endl;
            res.push_back(std::move(vec)); // 移动语义
        }
        // 释放结果集
        mysql_free_result(result);
    }
    return res;
}

bool StdMysql::StartTransaction()
{
    return !mysql_autocommit(&mysql, false); // =0 表示成功
}

bool StdMysql::Commit()
{
    mysql_commit(&mysql);
    return !mysql_autocommit(&mysql, true);
}

bool StdMysql::Rollback()
{
    mysql_rollback(&mysql);
    return !mysql_autocommit(&mysql, true);
}
